#include "module.h"
#include "module_pcmin.h"
#include <string.h> // memcpy
#include <stdio.h>  // printf fflush FILE fopen fwrite fclose

#define EPERM 1 /* Operation not permitted */
#define pr_info printf
#define MDATA_LEN (2 * 1024 * 1024) // 本模块先临时使用2M缓存
static struct module *target = NULL;
static unsigned char mdata[MDATA_LEN];
static int mdatalen = 0;
static FILE *fp = NULL;

static int module_init(void)
{
    fp = NULL;

    return 0;
}

static int module_start(void *param)
{
    start_param_t *iparam = param;

    if (iparam == NULL || iparam->file_name == NULL) {
        if (fp) {
            fclose(fp);
            fp = NULL;
        }
        return -EPERM;
    }

    /**
     * 注意，一定要用wb+，如果用w+会在每个0A前自动加上0D！
     * 声音数据不对会有很大的杂音
     */
    fp = fopen(iparam->file_name, "wb+");
    return 0;
}

static int module_run(void)
{
    if (!mdatalen) // 如果没有数据
        return 0;
    if (mdatalen) { // 如果有数据
        if (fp)
            fwrite(mdata, 1, mdatalen, fp);
        mdatalen = 0; // 数据清空
    }

    return 0;
}

static int module_stop(void)
{
    if (fp)
        fclose(fp);

    return 0;
}

static int module_exit(void)
{
    return 0;
}

static int module_settarget(void *mtarget)
{
    target = (struct module *)mtarget;

    return 0;
}

static int module_putdata(void *data, int len, int flag)
{
    if (mdatalen) // 有数据则不更新
        return 0;

    mdatalen = 0;
    memcpy(mdata, data, len);
    mdatalen = len;

    return 0;
}

struct module g_module_filesave = {
    "pcmin", module_init,
    module_start, module_run,
    module_stop, module_exit,
    module_settarget, module_putdata
};
